package com.hollysys.inspection.config;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Value("${file-server.root-dir}")
    private String fileRootDir;

    @Value("${file-server.files-mapping-dir:files}")
    private String filesMappingDir;

    @Value("${file-server.remove-temp-dir.expire}")
    private Integer expire;

    /**
     * 添加资源文件路径
     *
     * @param registry 资源注册对象
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        log.info("filesMappingDir : {}", filesMappingDir);
        log.info("fileRootDir : {}", fileRootDir);
        // 映射资源路径必须为已存在，不能是后创建的路径地址
        if (!FileUtil.exist(fileRootDir)) {
            FileUtil.mkdir(fileRootDir);
            log.info("fileRootDir : {}，创建成功", fileRootDir);
        } else {
            log.info("fileRootDir : {}已存在，跳过创建", fileRootDir);
        }
        // 映射资源路径
        registry.addResourceHandler("/" + filesMappingDir + "/**")
                .addResourceLocations("file:" + fileRootDir + "/");
        log.info("资源服务器注册成功");
    }

    /**
     * 临时文件夹定时清除逻辑
     * 两小时清除一次，清除两小时之前创建的问题
     */
    @Scheduled(cron = "${file-server.remove-temp-dir.cron}")
    public void clearTemp() {
        // 计算两小时之前的时间
        DateTime date = DateUtil.date();
        DateTime dateTime = DateUtil.offsetHour(date, expire);

        File rootDirFile = FileUtil.file(fileRootDir);
        List<File> files = FileUtil.loopFiles(rootDirFile, FileUtil::isFile);
        if (CollectionUtil.isEmpty(files)) {
            log.info("临时目录下文件列表为空，跳过定时清除操作");
            return;
        }
        // 过滤满足时间范围的文件,判断文件的最后更新时间
        List<String> outOffTimeFiles = files.stream().filter(item -> {
            Date lastModifiedTime = FileUtil.lastModifiedTime(item);
            return DateUtil.compare(lastModifiedTime, dateTime) < 1;
        }).map(FileUtil::getAbsolutePath).collect(Collectors.toList());

        log.info("当前系统时间：{}，待删除文件个数为：{}", DateUtil.formatDateTime(date), outOffTimeFiles.size());
        // 执行文件删除
        if (CollectionUtil.isNotEmpty(outOffTimeFiles)) {
            files.forEach(FileUtil::del);
        }

        // 清理空文件夹
        FileUtil.cleanEmpty(rootDirFile);
    }
}
